require(GGally, quietly = TRUE)
require(reshape2, quietly = TRUE)
library(tidyverse, warn.conflicts = F)
library(rvest)
library(plotly)
library(cluster)
library(ggdendro)
library(ggfortify)
library(broom)
Para realizar minha análise usarei os dados obtidos a partir do portal de transparência do governo federal, onde análisarei as seguintes variáveis de cada Unidade acadêmica da UFCG: o número de funcionários na Unidade acadêmica que não são professores(outros), o número de professores com carga horária 20h/semanal na UA, o número de professores com carga horária 40h/semanal na UA e idade mediana dos funcionarios no cargo, dando uma olhada nos dados temos:
dados <- read.csv("ufcg-201704-sumario-UAs-wide.csv")
dados_filtrados <- dados %>% select(-idade_25perc, -idade_75perc)
names(dados_filtrados) <- c("Unidade_Academica","Numero_Funcionarios","Numero_Professor_20h","Numero_Professor_40h","Idade_Mediana_Cargo")
dados_filtrados %>%
select(-Unidade_Academica) %>%
ggpairs()
Observando os dados acima vemos que eles estão bem dispersos, apesar de existir uma correlação razoável entre idade mediana e o número de funcionarios ela não é forte o suficiente para justificar um associação entre essas variáveis.
Para categorizar as nossas queridas Unidades Academicas, vamos usar o k-means(conhecido algoritmo para mineração de dados) para particionar os dados em grupos e observar as caracteristicas de cada grupo, para tanto devemos decidir o número de grupos que serão criados, assim podemos usar uma medida comumente usada no k-means para decidir um bom valor para o número de grupos, para tanto calcularemos a distância do centro de cada cluster para o centro dos dados e multiplicamos pelo número de pontos nesse cluster. Somando esse valor para todos os clusters, temos betweenss abaixo. Se esse valor for próximo do somatório total das distâncias dos pontos para o centro dos dados (totss), os pontos estão próximos do centro de seu cluster, essa proporção pode ser usada para definir um bom valor de número de grupos. Quando ela para de crescer, para de valer a pena aumentar o número de grupos.
set.seed(123)
explorando_k = tibble(k = 1:15) %>%
group_by(k) %>%
do(
kmeans(select(dados_filtrados, -Unidade_Academica),
centers = .$k,
nstart = 20) %>% glance()
)
explorando_k %>%
ggplot(aes(x = k, y = betweenss / totss)) +
labs(x = "Número de Grupos") +
geom_line() +
geom_point()
Olhando o gráfico acima parece que o gráfico começa a parar de crescer quando o número de grupos está perto de 6, então esse parece ser um bom número de grupos para os dados.
Assim utilizando o K-means e separando os dados em 6 grupos, temos os grupos abaixo:
set.seed(123)
km = dados_filtrados %>%
select(-Unidade_Academica) %>%
kmeans(centers = 6, nstart = 20)
dados_scaled = km %>%
augment(dados_filtrados) %>% # Adiciona o resultado de km
# aos dados originais dw2.scaled em
# uma variável chamada .cluster
gather(key = "variavel",
value = "valor",
-Unidade_Academica, -.cluster) # = move para long todas as
# variávies menos repository_language
# e .cluster
plot_grupos_unidades <- dados_scaled %>%
ggplot(aes(x = variavel, y = valor, group = Unidade_Academica, colour = .cluster)) +
geom_line(alpha = .5) +
facet_grid(.cluster~.)
plot_grupos_unidades
Para uma Visualização mais interativa(com os nomes das Unidades Academicas), temos o gráfico abaixo:
ggplotly(plot_grupos_unidades)
Podemos categorizar esse grupos da seguinte forma: